package add_$16_Case_12_1;
/*
 toString给出的是这个对象的具体内容，所有类型的对象都可以调用它，只要被实现过。
 toGenericString是Constructor,Method,Field这三个类专有的方法，如Constructor类，给出的是
 对应的构造函数的细节，比如修饰符，构造函数名和参数列表等
 */
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class RewriteToString {
    // 公有和私有的成员变量
    public String name;
    private int age;
    
    // 私有的构造方法
    private RewriteToString(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    
    // 公有构造方法
    public RewriteToString() {
        
    }
    
    // 私有方法
    private void methodTest() {
        
    }

    
    // 重写toString()方法
    public String toString(Object obj) {
        
        // 获得代表该类的Class对象
        Class<?> c = obj.getClass();
        
        // 利用StringBuilder来保存字符串
        StringBuilder sb = new StringBuilder();
        
        // 获得类所在包
        Package packageName = c.getPackage();
        
        // 输出类所在的包
        sb.append("包名：" + packageName.getName() + "\t");
        
        // 获得类的简单名称
        String className = c.getSimpleName();
        
        // 输出类的简单名称
        sb.append("类名" + className + "\n");
        
        //输出公共构造方法
        sb.append("公共构造方法：\n");
        
        // 获得所有构造方法
        Constructor<?>[] constructors = c.getDeclaredConstructors();
        for (Constructor<?> constructor : constructors) {
            // 将修饰符变为字符串，需要用Modifier类特有的toString(int modi)方法
            String modifier = Modifier.toString(constructor.getModifiers());
            // 输出公有构造方法
            if (modifier.contains("public")) {
                sb.append(constructor.toGenericString() + "\n");
            }
        }
        
        // 输出成员变量
        sb.append("成员变量：\n");
        
        // 获得所有公有的成员变量
        Field[] fields = c.getDeclaredFields();
        for (Field field : fields) {
            // 同理
            String fieldModi = Modifier.toString(field.getModifiers());
            if (fieldModi.contains("public")) {
                sb.append(field.toGenericString() + "\n");
            }
        }
        
        // 输出公共方法
        sb.append("公共方法：\n");
        
        // 获得所有方法
        Method[] methods = c.getDeclaredMethods();
        for (Method method : methods) {
            // 同理
            String MethodModi = Modifier.toString(method.getModifiers());
            if (MethodModi.contains("public")) {
                sb.append(method.toGenericString() + "\n");
            }
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub\
        RewriteToString rts = new RewriteToString();
        System.out.println(rts.toString(rts));
        System.out.println("------------------------------------");
        System.out.println(rts.toString(new Object()));
        
        
    }

}